<?php

namespace libraries;
use enums\HttpServerEnums;
if( ! APP_ROOT  ) return 'Direct Access Deny!';

/**
 *
 * @author fzq
 * @date 2016-06-27
 */
class CommUtils
{

	function __construct( )
	{
	
	}

	/**
	 * Generates an UUID with dash
	 * 32位+4
	 * @author     Anis uddin Ahmad <admin@ajaxray.com>
	 * @param      string  an optional prefix
	 * @return     string  the formatted uuid
	 */
	public static function getUUID()
	{
		return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), 
				mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), 
				mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
// 		mt_srand( $_SERVER[ 'REQUEST_TIME' ] );
// 		$chars = md5( uniqid( mt_rand(), true ) );
// 		$uuid = substr( $chars, 0, 8 ) . '-';
// 		$uuid .= substr( $chars, 8, 4 ) . '-';
// 		$uuid .= substr( $chars, 12, 4 ) . '-';
// 		$uuid .= substr( $chars, 16, 4 ) . '-';
// 		$uuid .= substr( $chars, 20, 12 );
// 		return $prefix . $uuid;
	}
	
	/**
	 * Generates an UUID with no dash
	 * 32位
	 * @author     Anis uddin Ahmad <admin@ajaxray.com>
	 * @param      string  an optional prefix
	 * @return     string  the formatted uuid
	 */
	public static function getUUIDNoDash( $prefix = '' )
	{
		return sprintf('%04X%04X%04X%04X%04X%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535),
				 mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), 
				mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
// 		mt_srand( $_SERVER[ 'REQUEST_TIME' ] );
// 		$chars = md5( uniqid( mt_rand(), true ) );
		
// 		return $prefix . $chars;
	}

	/**
	 * Generates a uniqe id
	 * 最多32位
	 * @author     Anis uddin Ahmad <admin@ajaxray.com>
	 * @param      string  an optional prefix
	 * @return     string  the formatted uuid
	 */
	public static function getUNID( $prefix = '' )
	{
// 		$chars = uniqid( mt_srand( $_SERVER[ 'REQUEST_TIME' ] ), true );
// 		$uuid = str_replace( '.', '', $chars );
		
// 		return $prefix . $uuid;
		return sprintf('%04X%04X%04X%04X%04X%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), 
				mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151),
				 mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
	}

	/**
	 * 取得指定长度的random num
	 * @param number $iLen
	 * @return string
	 */
	public static function getRandNum( $iLen = 8 )
	{
		
		$chars = substr( md5( uniqid() ), 0, $iLen );
		
		return substr( hexdec( $chars ), 0, $iLen );
	}
	/**
	 * 取得函数签名
	 * @param string $strClsSerialID
	 * @param string $strClass
	 * @param string $strFunc
	 * @return string
	 */
	public static function getFuncSignature( $strClsSerialID, $strClass, $strFunc )
	{
		return $strClsSerialID . $strClass . $strFunc;
	}

	/**
	 * 判断用户是否使用微信登录
	 */
	public static function isWeChatLogin()
	{
		if( strpos( $_SERVER[ 'HTTP_USER_AGENT' ], 'MicroMessenger' ) !== false )
		{//
			return true;
		}
		
		return false;
	}
	
	/**
	 * 0 for common(php-fpm, libphp...)
	 * 1 for swoole
	 */
	public static function getServerType()
	{
		if( class_exists( 'HttpServer' ) )
		{
			return HttpServerEnums::SERVER_TYPE_SWOOLE;
		}
		
		return HttpServerEnums::SERVER_TYPE_COMMON;
	}
	
	
	
	/**
	 * 检查身份证号是否合法 支持15位与18位身份证号
	 * 
	 * @param string $id_card
	 * @return boolean
	 */
	public static function validationFilterIDCard( $id_card )
	{
		if( strlen( $id_card ) == 18 )
		{
			return self::idcard_checksum18($id_card);
		}
		elseif( ( strlen( $id_card ) == 15 ) )
		{
			$id_card = self::idcard_15to18( $id_card );
			return self::idcard_checksum18( $id_card );
		}
		else
		{
			return false;
		}
	}

	// 计算身份证校验码，根据国家标准GB 11643-1999
	private static function idcard_verify_number( $idcard_base )
	{
		if( strlen( $idcard_base ) != 17)
		{
			return false;
		}
		//加权因子
		$factor = array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 );
		//校验码对应值
		$verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
		$checksum = 0;
		
		for ($i = 0; $i < strlen($idcard_base); $i++)
		{
			$checksum += substr($idcard_base, $i, 1) * $factor[$i];
		}
		
		$mod = $checksum % 11;
		$verify_number = $verify_number_list[ $mod ];
		return $verify_number;
	}

	/**
	 *  将15位身份证升级到18位
	 *  @param string $idcard;
	 *  
	 *  return false for error string for idcard
	 */
	public static function idcard_15to18( $idcard )
	{
		if(strlen($idcard) != 15 ) 
		{
			return false;
		}
		else
		{
			// 如果身份证顺序码是996 997 998 999，这些是为百岁以上老人的特殊编码
			if( array_search( substr( $idcard, 12, 3 ), array( '996', '997', '998', '999' )) !== false)
			{
				$idcard = substr($idcard, 0, 6) . '18'. substr($idcard, 6, 9);
			}
			else
			{
				$idcard = substr($idcard, 0, 6) . '19'. substr($idcard, 6, 9);
			}
		}
		
		$idcard = $idcard . self::idcard_verify_number($idcard);
		
		return $idcard;
		
	}
	
	// 18位身份证校验码有效性检查
	private static function idcard_checksum18($idcard)
	{
		if( strlen( $idcard ) != 18 )
		{ 
			return false; 
		}
		
		$idcard_base = substr( $idcard, 0, 17 );
		
		if( self::idcard_verify_number($idcard_base) != strtoupper( substr( $idcard, 17, 1 ) ) )
		{
			return false;
		}
		else	
		{
			return true;
		}
	}
}


?>